-- AlertStateM
-- create by zouby
-- 地牢中告警状态管理
--   处理过程：先通过AlertStateM.setState()/clearState接口来设置告警或清除告警
--           AlertStateM会根据优先级计算当前需要显示的告警，如果告警有变化，则
--           触发ALERT_STATE_CHANGED消息，UI层再根据变化后的state显示当前告警信息。

module("AlertStateM", package.seeall);

-- 状态定义， 值表示优先级，不可重复，值越小，优先级越高

-- 血量预警状态
ALERT_STATE_HP     = 1;

-- 光之石柱禁魔状态
ALERT_STATE_LIGHT_STONE  = 2;

-- 暗之石柱禁魔状态
ALERT_STATE_DARK_STONE  = 3;

-- 毒气装置散发毒气状态
ALERT_STATE_GAS_DEVICE = 4;

-- 电流干扰装置
ALERT_STATE_INTERFERE_DEVICE = 5;

-- 空状态
ALERT_STATE_NONE   = 0xFFFF;

-- 状态保存
local states = {};

-- 上一个状态
local lastState;

-- 初始化
function init()
	states = {};
	lastState = nil;
end

-- 设置状态
function setState(state)
	if table.indexOf(states, state) == -1 then
		table.insert(states, state);
		update();
	end
end

-- 清除状态
function clearState(state)
	table.removeItem(states, state);
	update();
end

-- 清除所有状态
function clearAllStates()
	states = {};
	update();
end

-- 更新
function update()
	local stateChanged, state = calcState();
	if stateChanged then
		EventMgr.fire(event.ALERT_STATE_CHAGNED, state);
	end
end

-- 根据优先级计算当前显示状态
function calcState()
	local s = ALERT_STATE_NONE;
	for _, state in pairs(states) do
		if state < s then
			s = state;
		end
	end

	if lastState ~= s then
		lastState = s;
		return true, s;
	end

	return false, nil;
end